/* 
 * File:   Complexe.h
 * Author: Gab'z
 *
 * Created on 1 mai 2012, 19:46
 **/

#ifndef COMPLEXE_H
#define	COMPLEXE_H
#include "Nombre.h"
#include "NombreSimple.h"
#include "Entier.h"

class Complexe : public Nombre {
    NombreSimple* _re;
    NombreSimple* _im;
public:

    Complexe(const Complexe& c) {
        _re = c._re->clone();
        _im = c._im->clone();
    }

    Complexe(const NombreSimple& c) {
        _re = c.clone();
        _im = new Entier(0);
    }
    //    Complexe(const Complexe* c) {
    //        _re = c->_re->clone();
    //        _im = c->_im->clone();
    //    }

    Complexe(const NombreSimple* c) {
        _re = c->clone();
        _im = new Entier(0);
    }

    Complexe(const NombreSimple& c1, const NombreSimple& c2) {
        _re = c1.clone();
        _im = c2.clone();
    }

    Complexe(const NombreSimple* c1, const NombreSimple* c2) {
        _re = c1->clone();
        _im = c2->clone();
    }


    virtual ~Complexe();

    Complexe* clone() const;

    const NombreSimple* getRe() const {
        return _re;
    }

    const NombreSimple* getIm() const {
        return _im;
    }

    Complexe& operator=(const Complexe& c) {
        if (this != &c) {
            delete _re;
            delete _im;
            _re = c._re;
            _im = c._im;
        }
        return *this;
    }

    //    Complexe operator+() const {
    //        return Complexe(*this);
    //    }


    //std::string toString() const {
    //        // utiliser un flux de sortie pour créer la chaîne
    //        std::ostringstream oss;
    //        // écrire la valeur dans le flux
    //        oss << _re->toString();
    //        oss << "$";
    //        oss << _im->toString();
    //        // renvoyer une string
    //        return oss.str();
    //    }

    std::string toString() const;

    Complexe& operator+=(const Complexe& c);
    Complexe& operator-=(const Complexe& c);
    Complexe& operator*=(const Complexe& c);
    Complexe& operator/=(const Complexe& c);
};

Complexe operator+(const Complexe& c1, const Complexe& c2);
Complexe operator-(const Complexe& c1, const Complexe& c2);
Complexe operator*(const Complexe& c1, const Complexe& c2);
Complexe operator/(const Complexe& c1, const Complexe& c2);

#endif	/* COMPLEXE_H */



